package siau.android.base;

import android.content.Context;
import android.content.pm.PackageManager;
import android.util.Log;

import androidx.annotation.Keep;

import com.taobao.sophix.PatchStatus;
import com.taobao.sophix.SophixApplication;
import com.taobao.sophix.SophixEntry;
import com.taobao.sophix.SophixManager;
import com.taobao.sophix.listener.PatchLoadStatusListener;

import hhm.android.library.LogUtils;

public class HotFixApplication extends SophixApplication {

    private final String TAG = "SophixStubApplication";

    /**
     * Sophix入口类，专门用于初始化Sophix，不应包含任何业务逻辑。
     * 此类必须继承自SophixApplication，onCreate方法不需要实现。
     * 此类不应与项目中的其他类有任何互相调用的逻辑，必须完全做到隔离。
     * AndroidManifest中设置application为此类，而SophixEntry中设为原先Application类。
     * 注意原先Application里不需要再重复初始化Sophix，并且需要避免混淆原先Application类。
     * 如有其它自定义改造，请咨询官方后妥善处理。
     */


    // 此处SophixEntry应指定真正的Application，并且保证RealApplicationStub类名不被混淆。
    @Keep
    @SophixEntry(SBApplication.class)
    static class RealApplicationStub {
    }

    @Override
    public void onCreate() {
        super.onCreate();

        loadNewPatch();
    }


    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);

        initSophix();

    }

    private void initSophix() {

        String appVersion;
        try {
            appVersion = this.getPackageManager().getPackageInfo(this.getPackageName(), 0).versionName;

            LogUtils.Companion.d(TAG, "appVersion=" + appVersion);
        } catch (PackageManager.NameNotFoundException e) {
            appVersion = "0.0.0";
            e.printStackTrace();
        }

        // initialize必须放在attachBaseContext最前面，初始化代码直接写在Application类里面，切勿封装到其他类。
        SophixManager.getInstance().setContext(this).setAppVersion(appVersion).setSecretMetaData(null, null, null).setEnableDebug(true).setEnableFullLog().setPatchLoadStatusStub(new PatchLoadStatusListener() {
            @Override
            public void onLoad(final int mode, final int code, final String info, final int handlePatchVersion) {
                LogUtils.Companion.d(TAG, "code=" + code);

                // 补丁加载回调通知
                if (code == PatchStatus.CODE_LOAD_SUCCESS) {
                    // 表明补丁加载成功

                } else if (code == PatchStatus.CODE_LOAD_RELAUNCH) {

                    // 表明新补丁生效需要重启. 开发者可提示用户或者强制重启;
                    // 建议: 用户可以监听进入后台事件, 然后调用killProcessSafely自杀，以此加快应用补丁，详见1.3.2.3
                } else {
                    // 其它错误信息, 查看PatchStatus类说明
                }
            }
        }).initialize();

    }


    private void loadNewPatch() {
        // queryAndLoadNewPatch不可放在attachBaseContext 中，否则无网络权限，建议放在后面任意时刻，如onCreate中
        SophixManager.getInstance().queryAndLoadNewPatch();
    }


}